//2.建立一个int数组a存储100以内的奇数。再从数组中挑选出所有的素数，将他们存储到另外一个数组b中。要求数组b的容量与素数个数匹配，不能多也不能少。
public class test {
    public static void main (String[] args) {
        // 1. 建立存储100以内奇数的数组a
        int[] a = createOddArray(100);

        // 2. 从数组a中挑选出所有的素数，存储到数组b中
        int[] b = filterPrimesFromArray(a);

        // 3. 输出结果
        System.out.println("数组a（100以内的奇数）：");
        printArray(a);

        System.out.println("\n数组b（从奇数中筛选出的素数）：");
        printArray(b);

        System.out.println("\n统计信息：");
        System.out.println("数组a容量：" + a.length);
        System.out.println("数组b容量：" + b.length);
        System.out.println("素数个数：" + b.length);
        System.out.println("数组b容量与素数个数是否匹配：" + (b.length == b.length));
    }

    /**
     * 创建100以内的奇数数组
     */
    public static int[] createOddArray(int max) {
        // 计算奇数个数：(最大值 + 1) / 2
        int count = (max + 1) / 2;
        int[] oddArray = new int[count];

        // 填充奇数
        int index = 0;
        for (int i = 1; i <= max; i += 2) {
            oddArray[index++] = i;
        }

        return oddArray;
    }

    /**
     * 从数组中筛选出所有的素数
     */
    public static int[] filterPrimesFromArray(int[] sourceArray) {
        // 第一步：统计素数个数
        int primeCount = 0;
        for (int num : sourceArray) {
            if (isPrime(num)) {
                primeCount++;
            }
        }

        // 第二步：创建容量完全匹配的数组
        int[] primeArray = new int[primeCount];

        // 第三步：填充素数
        int index = 0;
        for (int num : sourceArray) {
            if (isPrime(num)) {
                primeArray[index++] = num;
            }
        }

        return primeArray;
    }

    /**
     * 判断一个数是否为素数
     */
    public static boolean isPrime(int num) {
        // 小于2的数不是素数
        if (num < 2) {
            return false;
        }
        // 2是素数
        if (num == 2) {
            return true;
        }
        // 偶数且大于2的数不是素数
        if (num % 2 == 0) {
            return false;
        }

        // 检查从3到sqrt(num)的所有奇数因子
        for (int i = 3; i * i <= num; i += 2) {
            if (num % i == 0) {
                return false;
            }
        }

        return true;
    }

    /**
     * 打印数组内容
     */
    public static void printArray(int[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.printf("%3d", array[i]);
            if ((i + 1) % 10 == 0) {
                System.out.println(); // 每10个数字换一行
            } else if (i < array.length - 1) {
                System.out.print(", ");
            }
        }
        if (array.length % 10 != 0) {
            System.out.println(); // 如果最后一行不满10个，也换行
        }
    }
}